// 套接字  实现断开重连；

#include <func.h>

int main(int argc, char *argv[])
{
  ARGS_CHECK(argc, 3);
  // 创建流；
  int sfd = socket(AF_INET, SOCK_STREAM, 0); // 创建一个流
  ERROR_CHECK(sfd, -1, "socket");
  // 创建一个结构体(ipv4类型的),并且初始化这个结构体

  struct sockaddr_in addr;
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr(argv[1]);
  addr.sin_port = htons(atoi(argv[2]));
 
  // 这是一个客户端所以需要connect()；
  int ret = connect(sfd, (struct sockaddr *)&addr, sizeof(addr));
  char buf[4096] = {0};
  fd_set rdset; // 创建一个监听的结构体

  while (1)
  {
    // 加入监听 然后读写；
    FD_ZERO(&rdset);
    FD_SET(sfd, &rdset);
    FD_SET(STDIN_FILENO, &rdset);
    int ret = select(sfd+1, &rdset, NULL, NULL, NULL);
    ERROR_CHECK(ret, -1, "select");
    if (FD_ISSET(STDIN_FILENO, &rdset))
    {
      // 写就绪；
      memset(buf, 0, sizeof(buf));
      int ret = read(STDIN_FILENO, buf, sizeof(buf));
      if (ret == 0)
      {
        printf("end\n");
        break;
      }
      send(sfd, buf, strlen(buf), 0);
      
    }
    if (FD_ISSET(sfd, &rdset))
    {
      memset(buf, 0, sizeof(buf));
      int ret = recv(sfd, buf, sizeof(buf), 0);
      if (ret == 0)
      {
        printf("你是个好人\n");
        break;
      }
      puts(buf);
    }
  }
  close(sfd);

  return 0;
}